博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 如何生成CHM帮助文件
阅读量:6456 次
发布时间:2019-06-23

本文共 10032 字,大约阅读时间需要 33 分钟。

 

 

    前一段时间应公司要求,让我开发一个数据库字段信息CHM帮助文件生成软件。结果当时我就二了,这个东西我只用过,不知道咋做啊。没想到老大很随意说一句:"没事,这个软件我之前有有源码,只不过现在不能用了,你等会参考一下就可以了"。我当时还傻乎乎的谢天谢地,总算有源码可以参考了。当源代码发过来以后,我顿时石化了,我。。。。。,那玩意儿用c++builder开发的,硬着头皮看了一遍,全是带*指针变量、数组、集合、函数,更要命的是,一个类里面写了四五千行没注视的代码,函数中五六百行代码的有几个。 我说这不是坑人嘛?结果看了一天后,我果断放弃看了那个源码了,最后还是的感谢网上活跃的一帮朋友,在一个源码的帮助下(源码我不知道怎么上传,),终于完成了任务啊,

吐槽到此为止,言归正传,首先如下:

生成事件

View Code
1  ///  2         /// 生成 3         ///  4         ///  5         ///  6         private void button1_Click(object sender, EventArgs e) 7         { 8             try 9             {10                 if (!Directory.Exists("HTML"))  //判断名为HTML文件夹是否存在,不存在的话就创建一个11                 {12                     Directory.CreateDirectory("HTML"); 13                 }14                 startPath = Application.StartupPath;//起始路径15                 OpenHhp(_defaultTopic);//打开hhp文件16                 OpenHhc(_defaultTopic);//打开hhc文件17                 OpenHhk();//打开hhk文件18                 Compile();19                 MessageBox.Show("生成成功!");20             }21             catch (Exception ex)22             {23                 MessageBox.Show("生成失败!");24                 throw;25             }26           27         }

从方法中我可以看出,我们需要一个hhp文件,hhc文件,hhk文件,然后再执行compile方法就可以了

首先动态生一个hhp,代码如下:

 

1   ///  2         /// 创建hhp文件 3         ///  4         /// htm文件名 5         public void OpenHhp(string htmFile) 6         { 7             FileStream fs = new FileStream("test.hhp", FileMode.Create); //创建hhp文件 8             streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030")); 9             10 11             streamWriter.WriteLine("[OPTIONS]");12             streamWriter.WriteLine("Compatibility=1.1 or later");13             streamWriter.WriteLine("Compiled file=" + textBox1 .Text.Trim()+ ".chm");      //定义生成文件名称14             streamWriter.WriteLine("Contents file=test.hhc");15             streamWriter.WriteLine("Default topic=HTML\\全部对象.htm");16             streamWriter.WriteLine("Display compile progress=Yes");17             streamWriter.WriteLine("Index file=DBO_HELP.hhk");18             streamWriter.WriteLine("Language=0x804 中文(中国)");19             streamWriter.WriteLine("Title=数据库结构展示");20             streamWriter.WriteLine("      ");21             streamWriter.WriteLine("[FILES]");22             streamWriter.WriteLine("全部对象.htm");23             streamWriter.WriteLine("       ");24             streamWriter.WriteLine("[INFOTYPES]");25             streamWriter.WriteLine(htmFile);26             streamWriter.WriteLine();27             streamWriter.Close();28         }

这样在项目的根目录上面就生成了一个hhp文件 现在就要生成hhc文件了,它主要就是生成chm文件左边显示树形的内容,当点击节点,可以超链接要显示的页面(其实CHM中的内容都是HTML,你可以直接连接静态网页,),当然是显示在右边,而我的项目中要显示东西都是动态生成HTML文件,所以这个生成有些复杂,不过我这里会截取主要部分代码讲解:

private void OpenHhc(string htmFile) {     StringBuilder Modes = new StringBuilder();   FileStream fs = new FileStream(GetContentsHtmlFilename(), FileMode.Create); //创建hhp文件            streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"));            FileStream fs1 = new FileStream("HTML\\全部对象.htm", FileMode.Create); //            str1 = new System.IO.StreamWriter(fs1, System.Text.Encoding.GetEncoding("GB18030"));                       streamWriter.WriteLine("");            streamWriter.WriteLine("");            streamWriter.WriteLine("");            streamWriter.WriteLine("
"); streamWriter.WriteLine("
"); streamWriter.WriteLine(""); streamWriter.WriteLine(""); streamWriter.WriteLine(""); streamWriter.WriteLine(""); streamWriter.WriteLine(""); string sql = "SELECT mId,mName FROM Models"; DataTable dt = DBHelper.getDatatable(sql); for (int i = 0; i < dt.Rows.Count; i++) { #region if (i == 0) { streamWriter.WriteLine("
    "); streamWriter.WriteLine("
  • "); streamWriter.WriteLine(" "); streamWriter.WriteLine(" "); streamWriter.WriteLine(" "); streamWriter.WriteLine(" "); streamWriter.WriteLine("
      "); Modes.Append(" \r"); Modes.Append(" \r"); Modes.Append(" \r"); Modes.Append("
      所有模块 \r"); Modes.Append("
      \r"); Modes.Append("
      \r"); Modes.Append("
      \r"); Modes.Append("
      \r"); Modes.Append(" \r"); Modes.Append(" \r"); Modes.Append("
      全部模块
      \r"); Modes.Append("

      "); Modes.Append("
      \r"); } if (i > 0) { Modes.Append("
      "); Modes.Append("
      \r"); } streamWriter.WriteLine("
    • "); streamWriter.WriteLine(" "); streamWriter.WriteLine(" "); streamWriter.WriteLine(" "); //streamWriter.WriteLine(" "); streamWriter.WriteLine(" "); streamWriter.WriteLine("
    "); Modes.Append(" \r"); } streamWriter.WriteLine("
\r\r\r"); streamWriter.WriteLine(); streamWriter.Close(); str1.WriteLine(Modes); str1.Close(); }}

这语法很像HTML,但同时也不是,<UL></UL>代表一级节点,其中中间的 " <LI> <OBJECT type=\"text/sitemap\"><param name=\"Name\" value=\"数据库服务器\"><param name=\"Local\" value=\"HTML\\全部对象.htm\"><param name=\"ImageNumber\" value=\"13\"></OBJECT>"这段代码负责节点内容、连接、图片显示功能,如果<UL>内容嵌套的话,则表示下一级节点。还有我定义的modes,它主要负责生成一个Htm文件(记住用文件流生成,文件后缀名不要用html,而要用htm,不然会有错误,具体我也不知道啥原因),这样hhc文件生成在根目录下

接下来,则要生成hhk文件了

它主要负责你索引部分要显示的内容,这里生成也很简单

1 private void OpenHhk() 2         { 3             FileStream fs = new FileStream(startPath + @"\test.hhk", FileMode.Create); //创建hhp文件 4             //streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030")); 5             streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8")); 6             streamWriter.WriteLine(""); 7             streamWriter.WriteLine(""); 8             streamWriter.WriteLine(""); 9             streamWriter.WriteLine("
");10 streamWriter.WriteLine("
");11 streamWriter.WriteLine("");12 streamWriter.WriteLine("");13 streamWriter.WriteLine("
    ");14 string sql = "SELECT dId,dName,status,dCreTime,dFieidNum,dChName,dFunctionDesc FROM Documents order by dName";15 //string sqls = "";16 DataTable dt1 = DBHelper.getDatatable(sql);17 foreach (DataRow dr in dt1.Rows)18 {19 streamWriter.WriteLine("
  • ");20 streamWriter.WriteLine(" ");21 streamWriter.WriteLine("");22 streamWriter.WriteLine("");23 }24 streamWriter.WriteLine("
");25 streamWriter.WriteLine("");26 streamWriter.WriteLine("");27 streamWriter.WriteLine();28 streamWriter.Close();29 }

执行以后就可以在根目录下生成hhk文件了

到此为止,生成chm文件的必须的三大文件已经搞定了,下面就是compile方法了

1  string hhcFile = @"C:\Program Files\HTML Help Workshop\hhc.exe";//hhc.exe文件位置,windows自带的,一般是这个路径 2         public string _defaultTopic = "";//默认的页面 3  private bool Compile() 4         { 5             string _chmFile = startPath + @"\test.chm";//chm文件存储路径 6             Process helpCompileProcess = new Process();  //创建新的进程,用Process启动HHC.EXE来Compile一个CHM文件 7             try 8             { 9                 //判断文件是否存在并不被占用10                 try11                 {12                     string path = _chmFile;  //chm生成路径13                     if (File.Exists(path))14                     {15                         File.Delete(path);16                     }17                 }18                 catch(Exception e)19                 {20                     throw new Exception("文件被打开!");21                 }22 23                 ProcessStartInfo processStartInfo = new ProcessStartInfo();24                 processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;25                 processStartInfo.FileName = hhcFile;  //调入HHC.EXE文件 26                 processStartInfo.Arguments = "\"" + GetPathToProjectFile() + "\"";//获取空的HHP文件27                 processStartInfo.UseShellExecute = false;28                 helpCompileProcess.StartInfo = processStartInfo;29                 helpCompileProcess.Start();30                 helpCompileProcess.WaitForExit(); //组件无限期地等待关联进程退出31 32                 if (helpCompileProcess.ExitCode == 0)33                 {34                     MessageBox.Show(new Exception().Message);35                     return false;36                 }37             }38             finally39             {40                 helpCompileProcess.Close();41             }42             return true;43         }

满足上面三个文件要求,再执行这个方法,一个CHM帮助文件就可以生成,

其实网上有很多生成chm文件的工具,但我从没用过,还好目前我这个用着还可以凑合,而且显示的样式可以自己修改成自己喜欢的那种(考你样式了,)秀秀我的作品(悲催啊,不知道咋吧程序上传上来,希望有知道的告诉一下),写起来感觉有点吃力,不好勿喷

 

 本文转载自:

 

转载于:https://www.cnblogs.com/dogxuefeng/archive/2012/09/09/2677396.html

你可能感兴趣的文章
Ubuntu系统上安装Nginx服务器以及使用方法
查看>>
正则知识点
查看>>
Position属性:static、fixed、absolute和relative的区别和用法
查看>>
6_flutter_card(卡片),计算器,状态栏隐藏
查看>>
浅入浅出容器文件系统
查看>>
Android AsyncTask讲解
查看>>
swift-24xcode8内存分配图
查看>>
webpack 打包优化
查看>>
Android RxJava:基础介绍与使用
查看>>
用这四种套路更新缓存,你会少走很多弯路!
查看>>
[深圳] shopee 前端、后台、测试、安卓、产品经理、UI/UX 内推啦!
查看>>
和快手抖音类似的短视频直播APP,仿v聊富聊花间一对一直播收费APP
查看>>
重温操作系统——“共享”CPU
查看>>
vue的另一个内置组件keep-alive
查看>>
【本人秃顶程序员】在Java中使用函数范式提高代码质量
查看>>
如何在ReactJS中使用FastReport Core Web Report
查看>>
项目重构之缓存篇
查看>>
教你程序员的年终报告怎么写
查看>>
这就是我的研究生生活
查看>>
Meteor 项目完整 Demo ,涉及到大部分知识。 一款 Meteor 的 入门 Web App ,GitHub 开源。...
查看>>